package book;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.DBManager;
import common.TableManager;
/**
 * 削除対象書籍を確認画面【P232】に渡す。
 *
 * @author wakabayashi
 *
 */
public class DeleteCheckServlet extends HttpServlet {
	final String PATH_P202 =  "/book/SearchServlet";
	final String PATH_P232 =  "userBookDeleteCheck.jsp";

	static Connection	connection=null;
	static Statement	statement=null;
	static ResultSet		resultSet=null;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		System.out.println("DeleteCheckServlet : doGet");
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("UTF-8");

		sendInfo(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		System.out.println("DeleteCheckServlet : doPost");
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("UTF-8");

		sendInfo(req,resp);
	}

	public void sendInfo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		//	セッション情報からパラメータを取得
		@SuppressWarnings("unchecked")
		Map<String, String[]> m = (Map<String, String[]>)req.getSession().getAttribute("BookSerchParameter");
		if (m == null) {
			resp.sendRedirect("/Books/manager/login.jsp'");
			return;
		}

		String path 		= null;																			//	遷移先アドレス
		String message 	= null;																			//	メッセージ

		//		書籍検索結果（Ｐ2０２）で選択された書籍ＩＤを受け取る。
		String strId = req.getParameter("id");
		//		書籍ＩＤが空の場合
		//		メッセージに、「書籍を選択してください。」をセットし、書籍検索結果に遷移する。
		if (strId == null || strId.length() < 1) {
		//	path = PATH_P202;
			path = urlForBookSearchResult(m);
			message = "書籍を選択して下さい";
		}
		else {
			//		書籍テーブルより、書籍ＩＤが一致するレコードを取得する。
			BookBean book=(BookBean)TableManager
										.getRecord(TableManager.BOOKS_TABLE, Integer.parseInt(strId))
										.getBean();

			//		書籍レコードが存在しない場合
			//		メッセージに、「書籍を選択してください。」をセットし、書籍検索結果に遷移する。
			if (book == null) {
			//	path = PATH_P202;
				path = urlForBookSearchResult(m);
				message = "書籍を選択して下さい";
			}
			//		書籍レコードが存在する場合
			else if (book.isDeleteFlag()){
				//		書籍レコードが削除済みの場合
				//		メッセージに、「この書籍は削除済みです。」をセットし、書籍検索結果に遷移する。
			//	path = PATH_P202;
				path = urlForBookSearchResult(m);
				message = "この書籍は削除済みです";
			}
			else {
				//		書籍レコードより、各項目をリクエスト情報にセットする。
				path = PATH_P232;
				req.setAttribute("book", book);

				String sql_isbn = "select * from books where isbn = '" + book.getIsbn() + "'";
				String sql_reserve = "select count(*) as cnt from reserves where book_isbn = ?";

				int holds = 0;
				int rentals = 0;
				int reserves = 0;
				int books = 0;
				try {
					Connection con = DBManager.getConnection();
					PreparedStatement sql = con.prepareStatement(sql_reserve);
					//		書籍テーブルより、書籍レコードのＩＳＢＮが一致するレコードを検索する。
					Statement stm = con.createStatement();
					ResultSet rs = stm.executeQuery(sql_isbn);

					while (rs.next()) {
						System.out.println("isbn : " + rs.getString("isbn") + " book_id : " + rs.getInt("id"));

						//		検索結果のレコード数を、所蔵数とする。
						holds++;
						//		検索結果のレコードのうち、貸出ＩＤがセットされているレコード数を、貸出中冊数とする。
						if (rs.getInt("rental_id") > 0) {
							System.out.println("isbn : " + rs.getString("isbn") + " book_id : " + rs.getInt("id") + " rental_id : " + rs.getInt("rental_id"));

							rentals++;
						}
					}
					//		検索結果のレコードの書籍ＩＤで予約テーブルを検索し、該当するレコード件数を予約数としてカウントする。
					sql.setString(1, book.getIsbn());
					ResultSet rs_rsv = sql.executeQuery();
					if (rs_rsv.next()) {
						reserves = rs_rsv.getInt("cnt");
					}
					//		貸出可能冊数を計算する。
					//		貸出可能冊数　＝　所蔵数　－　貸出中冊数　－　予約数
					books = holds - rentals - reserves;
				}
				catch (SQLException e) {
					e.printStackTrace();
				}
				//		holds			:	所蔵数
				//		rentals		:	貸出中冊数
				//		reserves	:	予約数
				//		books		:	貸出可能冊数
				req.setAttribute("holds", holds);
				req.setAttribute("rentals", rentals);
				req.setAttribute("reserves", reserves);
				req.setAttribute("books", books);
			}
		}
		req.setAttribute("msg", message);

		//		書籍情報削除確認（Ｐ２３２）へ遷移する。
		RequestDispatcher requestDispatcher=req.getRequestDispatcher(path);
		requestDispatcher.forward(req, resp);
	}

	String urlForBookSearchResult(Map<String, String[]> map) {
		String[] urls = (String[])map.get("url");
		String[] pages = (String[])map.get("page");

		StringBuffer url = new StringBuffer(PATH_P202);
		url.append("?");
		url.append(urls[0]);
		url.append("&page=");
		url.append(pages[0]);

		return url.toString();
	}
}
